﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EvaluationSettings;
using System.Collections;
using System.Reflection;

namespace ESMOffline
{
    public partial class frmPreguntas : Form
    {
        #region Propiedades Publicas y Privadas

        CEvaluacion _objevaluacion = new CEvaluacion();
        Form _frmSeleccion = null;
        int cant_actores = 0;
        int indice_activo = 0;
        IEnumerable col_top_eval = null;

        private int _ieid;

        public int Ieid
        {
            get { return _ieid; }
            set { _ieid = value; }
        }

        private int _medie;

        public int Medid
        {
            get { return _medie; }
            set { _medie = value; }
        }

        private int _evalid;

        public int Evalid
        {
            get { return _evalid; }
            set { _evalid = value; }
        }

        private int _actorid;

        public int Actorid
        {
            get { return _actorid; }
            set { _actorid = value; }
        }

        #endregion

        #region Eventos del Formulario
        public frmPreguntas()
        {
            InitializeComponent();
        }

        public frmPreguntas(int ieid, int medid)
        {
            InitializeComponent();

            if (ieid != 0)
                _ieid = ieid;
            if (medid != 0)
                _medie = medid;

            col_top_eval = new CEvaluacion().ObtenerTopEvaluacion(5, _medie, _ieid);

            var dt_topeval = ObtainDataTableFromIEnumerable(col_top_eval);

            gvTopEval.DataSource = dt_topeval;
            gvTopEval.Refresh();
        }

        public frmPreguntas(int ieid, int medid, Form frmSeleccion)
        {
            InitializeComponent();

            if (ieid != 0)
                _ieid = ieid;
            if (medid != 0)
                _medie = medid;

            col_top_eval = new CEvaluacion().ObtenerTopEvaluacion(5, _medie, _ieid);

            var dt_topeval = ObtainDataTableFromIEnumerable(col_top_eval);

            gvTopEval.DataSource = dt_topeval;
            gvTopEval.Refresh();
            this.FormClosed += new FormClosedEventHandler(frmPreguntas_FormClosed);
        }

        void frmPreguntas_FormClosed(object sender, FormClosedEventArgs e)
        {
            _frmSeleccion.Visible = true;
        }

        private void frmPreguntas_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'eSMDataSet.dbo_Actores' table. You can move, or remove it, as needed.
            this.dbo_ActoresTableAdapter.Fill(this.eSMDataSet.dbo_Actores);
            //CargarPreguntas();
        }

        private void cboActores_SelectedIndexChanged(object sender, EventArgs e)
        {
            int cant_actores_entradas = 0;
            if (cant_actores == 0)
            {
                bool actorexiste = false;
                //for (int i = 0; i < gvTopEval.Rows.Count; i++)
                //{
                //    if (cboActores.SelectedValue == gvTopEval.Rows[i].Cells[2].Text)
                //    {
                //        if (gvTopEval.Rows[i].Cells[5].Text != "Parcial")
                //            actorexiste = true;
                //    }
                //}
                if (!actorexiste)
                {
                    var actor = (DataRowView)cboActores.SelectedItem;
                    EvaluarActorSeleccionado(actor.DataView[cboActores.SelectedIndex].Row[2].ToString(), Convert.ToInt32(cboActores.SelectedValue));
                    gvAmb1.Visible = true;
                    gvAmb2.Visible = true;
                    gvAmb3.Visible = true;
                    gvAmb4.Visible = true;
                    gvAmb5.Visible = true;
                }
                else
                {
                    //Alert.Show(udpnlFiltro, "El actor seleccionado ya fue evaluado en la medicion actual.");
                    gvAmb1.Visible = false;
                    gvAmb2.Visible = false;
                    gvAmb3.Visible = false;
                    gvAmb4.Visible = false;
                    gvAmb5.Visible = false;
                    //btnalmacenarparcial.Visible = false;
                    //btnDefinitiva.Visible = false;

                }
                cant_actores++;
                indice_activo = cboActores.SelectedIndex;
            }
            else
            {
                cboActores.SelectedIndex = indice_activo;
                cant_actores_entradas++;
                if (cant_actores_entradas == 1)
                    cant_actores = 0;
            }
        }

        private void gvAmb1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void gvTopEval_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == -1)
                MessageBox.Show("Identificador no encontrado.");
            else if (e.ColumnIndex == 0)
            {
                _evalid = Convert.ToInt32(gvTopEval.Rows[e.RowIndex].Cells[1].Value);
                _actorid = Convert.ToInt32(gvTopEval.Rows[e.RowIndex].Cells[2].Value);

                CargarParcial(_evalid, _actorid);
            }
        }
        #endregion

        #region Metodos con relacion a Datos

        /// <summary>
        /// Ejecuta el proceso de carga para las evaluaciones ya realizadas validando: Sesiones, Pendientes, L,P,LP
        /// </summary>
        /// <param name="ideval">Identificador de evaluación</param>
        /// <param name="idactor">identificador del actor a cargar</param>
        protected void CargarParcial(int ideval, int idactor)
        {
            //Instancio un objeto del tipo List que almacena la colección de preguntas por ambiente
            var objList = _objevaluacion.LoadEvalParcial(_evalid, _actorid);

            bool reload = false;

            //Definicion variables con propiedades de datos para Data Base
            #region Consulta de Resultados

            var ds_resultadosbyevaluacion = new ESMDataSet.dbo_ResultadosByEvaluacionDataTable();
            var ds_resultados = new ESMDataSet.dbo_ResultadosDataTable();
            var ds_preguntas = new ESMDataSet.dbo_PreguntasDataTable();

            var ds_ambientes = new ESMDataSet.dbo_AmbientesDataTable();
            var ds_procesos = new ESMDataSet.dbo_ProcesosDataTable();
            var ds_componentes = new ESMDataSet.dbo_ComponentesDataTable();

            var da_resultadosbyevaluacion = new ESMDataSetTableAdapters.dbo_ResultadosByEvaluacionTableAdapter();
            var da_resultados = new ESMDataSetTableAdapters.dbo_ResultadosTableAdapter();
            var da_preguntas = new ESMDataSetTableAdapters.dbo_PreguntasTableAdapter();

            var da_ambientes = new ESMDataSetTableAdapters.dbo_AmbientesTableAdapter();
            var da_procesos = new ESMDataSetTableAdapters.dbo_ProcesosTableAdapter();
            var da_componentes = new ESMDataSetTableAdapters.dbo_ComponentesTableAdapter();

            //Defino la estructura de la variable resultbyeval del tipo IEnumerable
            var resultbyeval = from rbe in ds_resultadosbyevaluacion
                               join res in ds_resultados on rbe.IdResultado equals res.IdResultados
                               join pre in ds_preguntas on res.IdPregunta equals pre.IdPregunta
                               join cmp in ds_componentes on pre.IdComponente equals cmp.IdComponente
                               join pro in ds_procesos on cmp.IdProceso equals pro.IdProceso
                               join amb in ds_ambientes on pro.IdAmbiente equals amb.IdAmbiente
                               where rbe.IdEvaluacion == ideval && amb.IdAmbiente == 1
                               select new { res.IdPregunta, res.IdResultados, res.Valor, res.Pendiente, pre.Pregunta, res.Sesiones, pre.Ocultar, pre.Etiqueta, pre.IdOrden };

            //Ejecuto el proceso de carga para los dataset involucrados en los join de la estructura anterior
            da_resultadosbyevaluacion.Fill(ds_resultadosbyevaluacion);
            da_resultados.Fill(ds_resultados);
            da_preguntas.Fill(ds_preguntas);

            da_ambientes.Fill(ds_ambientes);
            da_procesos.Fill(ds_procesos);
            da_componentes.Fill(ds_componentes);

            #endregion

            //Ejecuto el proceso de consulta para cada uno de los ambientes segun la variable secuencial g.
            for (int g = 0; g < 5; g++)
            {
                DataGridView objGridView = null;

                #region Cargar resultados segun ambientes

                switch (g + 1)
                {
                    case 1:
                        resultbyeval = from rbe in ds_resultadosbyevaluacion
                                       join res in ds_resultados on rbe.IdResultado equals res.IdResultados
                                       join pre in ds_preguntas on res.IdPregunta equals pre.IdPregunta
                                       join cmp in ds_componentes on pre.IdComponente equals cmp.IdComponente
                                       join pro in ds_procesos on cmp.IdProceso equals pro.IdProceso
                                       join amb in ds_ambientes on pro.IdAmbiente equals amb.IdAmbiente
                                       where rbe.IdEvaluacion == ideval && amb.IdAmbiente == 1
                                       select new { res.IdPregunta, res.IdResultados, res.Valor, res.Pendiente, pre.Pregunta, res.Sesiones, pre.Ocultar, pre.Etiqueta, pre.IdOrden };
                        break;
                    case 2:
                        resultbyeval = from rbe in ds_resultadosbyevaluacion
                                       join res in ds_resultados on rbe.IdResultado equals res.IdResultados
                                       join pre in ds_preguntas on res.IdPregunta equals pre.IdPregunta
                                       join cmp in ds_componentes on pre.IdComponente equals cmp.IdComponente
                                       join pro in ds_procesos on cmp.IdProceso equals pro.IdProceso
                                       join amb in ds_ambientes on pro.IdAmbiente equals amb.IdAmbiente
                                       where rbe.IdEvaluacion == ideval && amb.IdAmbiente == 2
                                       select new { res.IdPregunta, res.IdResultados, res.Valor, res.Pendiente, pre.Pregunta, res.Sesiones, pre.Ocultar, pre.Etiqueta, pre.IdOrden };
                        break;
                    case 3:
                        resultbyeval = from rbe in ds_resultadosbyevaluacion
                                       join res in ds_resultados on rbe.IdResultado equals res.IdResultados
                                       join pre in ds_preguntas on res.IdPregunta equals pre.IdPregunta
                                       join cmp in ds_componentes on pre.IdComponente equals cmp.IdComponente
                                       join pro in ds_procesos on cmp.IdProceso equals pro.IdProceso
                                       join amb in ds_ambientes on pro.IdAmbiente equals amb.IdAmbiente
                                       where rbe.IdEvaluacion == ideval && amb.IdAmbiente == 3
                                       select new { res.IdPregunta, res.IdResultados, res.Valor, res.Pendiente, pre.Pregunta, res.Sesiones, pre.Ocultar, pre.Etiqueta, pre.IdOrden };
                        break;

                    case 4:
                        resultbyeval = from rbe in ds_resultadosbyevaluacion
                                       join res in ds_resultados on rbe.IdResultado equals res.IdResultados
                                       join pre in ds_preguntas on res.IdPregunta equals pre.IdPregunta
                                       join cmp in ds_componentes on pre.IdComponente equals cmp.IdComponente
                                       join pro in ds_procesos on cmp.IdProceso equals pro.IdProceso
                                       join amb in ds_ambientes on pro.IdAmbiente equals amb.IdAmbiente
                                       where rbe.IdEvaluacion == ideval && amb.IdAmbiente == 4
                                       select new { res.IdPregunta, res.IdResultados, res.Valor, res.Pendiente, pre.Pregunta, res.Sesiones, pre.Ocultar, pre.Etiqueta, pre.IdOrden };
                        break;
                    case 5:
                        resultbyeval = from rbe in ds_resultadosbyevaluacion
                                       join res in ds_resultados on rbe.IdResultado equals res.IdResultados
                                       join pre in ds_preguntas on res.IdPregunta equals pre.IdPregunta
                                       join cmp in ds_componentes on pre.IdComponente equals cmp.IdComponente
                                       join pro in ds_procesos on cmp.IdProceso equals pro.IdProceso
                                       join amb in ds_ambientes on pro.IdAmbiente equals amb.IdAmbiente
                                       where rbe.IdEvaluacion == ideval && amb.IdAmbiente == 5
                                       select new { res.IdPregunta, res.IdResultados, res.Valor, res.Pendiente, pre.Pregunta, res.Sesiones, pre.Ocultar, pre.Etiqueta, pre.IdOrden };
                        break;
                }

                #endregion

                var result_controls = this.Controls.Find(String.Format("gvAmb{0}", g + 1).ToString(), true);
                if (result_controls != null)
                    objGridView = (DataGridView)result_controls[0];

                var dt_resulteval = ObtainDataTableFromIEnumerable(objList[g]);

                objGridView.AutoGenerateColumns = false;
                objGridView.DataSource = dt_resulteval;
                objGridView.Refresh();


                var listresults = resultbyeval.ToList();
                int progreso = objGridView.Rows.Count / 100;
                prbarCargarEval.Value = 0;
                for (int i = 0; i < objGridView.Rows.Count; i++)
                {
                    prbarCargarEval.Value = prbarCargarEval.Value + progreso;
                    foreach (var item in resultbyeval)
                    {
                        DataGridViewCell lblNoOrden = objGridView.Rows[i].Cells[0];
                        DataGridViewCell cbosino = objGridView.Rows[i].Cells[1];
                        DataGridViewCell chxPendientes = objGridView.Rows[i].Cells[2];
                        DataGridViewCell labelLP = objGridView.Rows[i].Cells[4];
                        DataGridViewCell txtsesiones = objGridView.Rows[i].Cells[5];

                        int idPregunta = Convert.ToInt32(lblNoOrden.Value);

                        if (idPregunta == item.IdOrden)
                        {

                            ESMDataSet.dbo_AyudaByPreguntaRow objAyudaByPregunta = _objevaluacion.ObtenerAyudaPregunta(item.IdPregunta);

                            if ((bool)objAyudaByPregunta.Lectura && (bool)objAyudaByPregunta.Participacion)
                            {
                                chxPendientes.ReadOnly = false;
                                if ((bool)item.Pendiente)
                                {
                                    chxPendientes.Value = (bool)item.Pendiente;
                                }
                                labelLP.Value = "LP";
                            }
                            else if ((bool)objAyudaByPregunta.Lectura)
                                labelLP.Value = "L";
                            else if ((bool)objAyudaByPregunta.Participacion)
                                labelLP.Value = "P";

                            if (item.Pregunta.Trim().Length == 0 || item.Pregunta == null || item.Pregunta == "")
                            {
                                reload = true;
                            }

                            if (reload)
                            {
                                objGridView.Refresh();
                                reload = false;
                            }

                            if (item.Ocultar != null)
                            {
                                if ((bool)item.Ocultar == true)
                                {
                                    txtsesiones.ReadOnly = true;
                                    chxPendientes.ReadOnly = true;
                                    cbosino.ReadOnly = true;
                                    labelLP.ReadOnly = true;

                                }

                                ESMDataSet.dbo_PreguntasRow objPreguntas = _objevaluacion.ObtenerDatosPregunta(Convert.ToInt32(idPregunta));
                                if ((bool)objPreguntas.Sesiones)
                                {
                                    txtsesiones.ReadOnly = false;
                                    txtsesiones.Value = item.Sesiones.ToString();
                                }
                                else
                                {
                                    txtsesiones.ReadOnly = true;
                                    txtsesiones.Value = 0;
                                }
                                if (item.Valor == "1")
                                {
                                    cbosino.Value = "Si";
                                    txtsesiones.ReadOnly = false;
                                }
                                else if (item.Valor == "0")
                                {
                                    cbosino.Value = "No";
                                    txtsesiones.ReadOnly = true;
                                    txtsesiones.Value = 0;
                                }

                                break;

                            }

                        }

                    }
                    //cboActores.SelectedValue = idactor.ToString();
                    //lblActorEvaluado.Text = cboActores.SelectedItem.Text;

                    //var estadoeval = from e in db.Evaluacions
                    //                 where e.IdEvaluacion == ideval
                    //                 select e;

                    //var evalsta = estadoeval.ToList();

                    //if (evalsta[0].IdEstado == 1)
                    //{
                    //    objGridView.Visible = true;
                    //    objGridView.Enabled = false;
                    //    informacionuno.Visible = false;
                    //    //btnalmacenarparcial.Visible = false;
                    //    //btnDefinitiva.Visible = false;
                    //}
                    //else
                    //{
                    //    objGridView.Visible = true;
                    //    informacionuno.Visible = true;
                    //    //btnalmacenarparcial.Visible = true;
                    //    ////btnDefinitiva.Visible = true;
                    //}

                }
                //activa_timer.Value = "1";
                prbarCargarEval.Value = 100;
            }

        }

        //<summary>
        //Carga el datasource del gridview evaluacion deacuerdo a al actor seleccionado
        //</summary>
        //<param name="objevaluacion"></param>
        protected void CargarPreguntas(CEvaluacion _objevaluacion)
        {
            try
            {
                #region Cargar Preguntas Ambientes
                System.Windows.Forms.Application.DoEvents();
                List<IEnumerable<ESMDataSet.dbo_PreguntasRow>> cpreguntas = new List<IEnumerable<ESMDataSet.dbo_PreguntasRow>>();
                cpreguntas = _objevaluacion.LoadEvaluation();
                int contador = 0;

                for (int p = 0; p < cpreguntas.Count; p++)
                {
                    System.Windows.Forms.Application.DoEvents();

                    DataGridView objGridView = null;

                    var result_controls = this.Controls.Find(String.Format("gvAmb{0}", p + 1).ToString(), true);
                    if (result_controls != null)
                        objGridView = (DataGridView)result_controls[0];

                    if (cpreguntas[p] != null)
                    {
                        objGridView.AutoGenerateColumns = false;
                        //Llama al metodo load del objeto CEvaluacion que obtiene el Iqueryable para asignar al datasource del control
                        objGridView.DataSource = cpreguntas[p].CopyToDataTable();
                        //Actualizo el control Gridview en el formulario para que almacene los cambio realizados
                        objGridView.Refresh();
                    }

                    for (int i = 0; i < objGridView.Rows.Count; i++)
                    {
                        System.Windows.Forms.Application.DoEvents();
                        DataGridViewCell lblNoOrden = objGridView.Rows[i].Cells[0];
                        DataGridViewCell cbosino = objGridView.Rows[i].Cells[1];
                        DataGridViewCell chxPendientes = objGridView.Rows[i].Cells[2];
                        DataGridViewCell labelLP = objGridView.Rows[i].Cells[4];
                        DataGridViewCell txtsesiones = objGridView.Rows[i].Cells[5];

                        int idPregunta = Convert.ToInt32(lblNoOrden.Value);
                        foreach (var item in cpreguntas[p])
                        {
                            if (item.IdOrden == idPregunta)
                            {
                                if (item.Sesiones != null)
                                {
                                    if ((bool)item.Sesiones)
                                        txtsesiones.ReadOnly = false;
                                }
                                ESMDataSet.dbo_AyudaByPreguntaRow objAyudaByPregunta = _objevaluacion.ObtenerAyudaPregunta(item.IdPregunta);
                                if ((bool)objAyudaByPregunta.Lectura && (bool)objAyudaByPregunta.Participacion)
                                {
                                    labelLP.Value = "LP";
                                    chxPendientes.ReadOnly = false;
                                }
                                else if ((bool)objAyudaByPregunta.Lectura)
                                    labelLP.Value = "L";
                                else if ((bool)objAyudaByPregunta.Participacion)
                                    labelLP.Value = "P";
                                else
                                    labelLP.ReadOnly = true;

                                if (item.Ocultar != null)
                                {
                                    if ((bool)item.Ocultar == true)
                                    {
                                        txtsesiones.ReadOnly = true;
                                        chxPendientes.ReadOnly = true;
                                        cbosino.ReadOnly = true;
                                        labelLP.ReadOnly = true;
                                    }

                                }

                            }

                        }

                        System.Windows.Forms.Application.DoEvents();
                    }

                    System.Windows.Forms.Application.DoEvents();
                    contador++;
                }

                #endregion

            }
            /*En caso de presentar excepcion retorno una alerta en javascript que me muestra y me controla el error presentado*/
            catch (Exception) { }
        }

        /// <summary>
        /// Obtiene la coleccion de preguntas para el actor seleccionado en caso de no
        /// existir evaluación para el mismo
        /// </summary>
        /// <param name="actorSeleccionado">Nombre de actor seleccionado</param>
        /// <param name="idactor">Identificador de actor seleccionado</param>
        protected void EvaluarActorSeleccionado(string actorSeleccionado, int idactor)
        {

            //if (_objevaluacion.ValidarActores(idie, idactor, idmedicion))
            //{
            //Identifico el actor seleccionado para cargar las preguntas en los respectivos Ambientes (Coleccion de DataGridView)
            switch (actorSeleccionado)
            {
                case "No Asignado":
                    gvAmb1.DataSource = null;
                    gvAmb2.DataSource = null;
                    gvAmb3.DataSource = null;
                    gvAmb4.DataSource = null;
                    gvAmb5.DataSource = null;
                    gvAmb1.Refresh();
                    gvAmb2.Refresh();
                    gvAmb3.Refresh();
                    gvAmb4.Refresh();
                    gvAmb5.Refresh();
                    break;

                case "Estudiante":
                    _objevaluacion = new EvaluationSettings.CEvaluacion();
                    _objevaluacion.Estudiantes = true;
                    CargarPreguntas(_objevaluacion);
                    break;

                case "Profesional de Campo":
                    _objevaluacion = new EvaluationSettings.CEvaluacion();
                    _objevaluacion.Profesional = true;
                    CargarPreguntas(_objevaluacion);
                    //lblActorEvaluado.Text = "Profesional de Campo";
                    //gvEvaluacion.Visible = true;
                    break;

                case "Educador":
                    _objevaluacion = new EvaluationSettings.CEvaluacion();
                    _objevaluacion.Docentes = true;
                    CargarPreguntas(_objevaluacion);
                    //lblActorEvaluado.Text = "Educador";
                    //gvEvaluacion.Visible = true;
                    break;

                case "Padre de Familia":
                    _objevaluacion = new EvaluationSettings.CEvaluacion();
                    _objevaluacion.Padres = true;
                    CargarPreguntas(_objevaluacion);
                    //lblActorEvaluado.Text = "Padre de Familia";
                    //gvEvaluacion.Visible = true;
                    break;

                case "Directivos":
                    _objevaluacion = new EvaluationSettings.CEvaluacion();
                    _objevaluacion.Directivos = true;
                    CargarPreguntas(_objevaluacion);
                    //lblActorEvaluado.Text = "Directivos";
                    //gvEvaluacion.Visible = true;
                    break;

                case "Secretaria de Educacion":
                    _objevaluacion = new EvaluationSettings.CEvaluacion();
                    _objevaluacion.SecretariaEducacion = true;
                    CargarPreguntas(_objevaluacion);
                    //lblActorEvaluado.Text = "Secretaria de Educacion";
                    //gvEvaluacion.Visible = true;
                    break;
            }


            //}
            //else
            //{
            //    lblerrorAc.Text = _objevaluacion.Error;
            //    lblerrorAc.Visible = true;
            //    //btnalmacenarparcial.Visible = false;
            //    //btnDefinitiva.Visible = false;
            //    informacionuno.Visible = false;
            //    //btnVolverEE.Visible = true;
            //    gvAmb1.Visible = false;
            //    gvAmb2.Visible = false;
            //    gvAmb3.Visible = false;
            //    gvAmb4.Visible = false;
            //    gvAmb5.Visible = false;
            //    gvAmb1.DataSource = null;
            //    gvAmb2.DataSource = null;
            //    gvAmb3.DataSource = null;
            //    gvAmb4.DataSource = null;
            //    gvAmb5.DataSource = null;
            //    gvAmb1.DataBind();
            //    gvAmb2.DataBind();
            //    gvAmb3.DataBind();
            //    gvAmb4.DataBind();
            //    gvAmb5.DataBind();
            //}

        }

        /// <summary>
        /// Convierte un objeto del tipo IEnumerable en un objeto DataTable
        /// </summary>
        /// <param name="ien">Objeto del tipo IEnumerable</param>
        /// <returns>Objetc DataTable</returns>
        protected DataTable ObtainDataTableFromIEnumerable(IEnumerable ien)
        {
            DataTable dt = new DataTable();
            foreach (object obj in ien)
            {
                Type t = obj.GetType();
                PropertyInfo[] pis = t.GetProperties();
                if (dt.Columns.Count == 0)
                {
                    foreach (PropertyInfo pi in pis)
                    {
                        dt.Columns.Add(pi.Name, pi.PropertyType);
                    }
                }
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo pi in pis)
                {
                    object value = pi.GetValue(obj, null);
                    dr[pi.Name] = value;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        #endregion

        protected void AlmacenarInformacion(bool estado, bool auto = false)
        {
            bool valid = true;
            DataGridView objGridView = null;
            int posiciones = gvAmb1.Rows.Count + gvAmb2.Rows.Count + gvAmb3.Rows.Count + gvAmb4.Rows.Count + gvAmb5.Rows.Count;
            object[,] CollectionResultados = new object[posiciones, 4];

            for (int p = 0; p < 5; p++)
            {
                Control[] controls_result = this.Controls.Find(String.Format("gvAmb{0}", p + 1), true);

                if (controls_result.Count() != 0)
                    objGridView = (DataGridView)controls_result[0];

                for (int i = 0; i < objGridView.Rows.Count; i++)
                {
                    DataGridViewRow objGridViewRow = objGridView.Rows[i];
                    string preguntaid = objGridViewRow.Cells[0].Value.ToString();
                    if (objGridViewRow.Cells[1].Value != null)
                    {
                        string cbosino = objGridViewRow.Cells[1].Value.ToString();
                        if (!objGridViewRow.Cells[1].ReadOnly)
                        {
                            if (cbosino != "Si" && cbosino != "No")
                            {
                                valid = false;
                            }
                        }
                    }
                }
            }
            int estado_i = 0;
            if (!estado)
                estado_i = 2;
            else
                estado_i = 1;
            if (estado_i != 0)
            {
                if (valid)
                {
                    _objevaluacion = new EvaluationSettings.CEvaluacion();

                    int contador = 0;
                    for (int p = 0; p < 5; p++)
                    {
                        Control[] controls_result = this.Controls.Find(String.Format("gvAmb{0}", p + 1), true);

                        if (controls_result.Count() != 0)
                            objGridView = (DataGridView)controls_result[0];

                        for (int i = 0; i < objGridView.Rows.Count; i++)
                        {
                            DataGridViewRow objGridViewRow = objGridView.Rows[i];
                            string preguntaid = objGridViewRow.Cells[0].Value.ToString();

                            object cbosino = null;
                            if (objGridViewRow.Cells[1].Value != null)
                                cbosino = objGridViewRow.Cells[1].Value.ToString();

                            object objpendiente = null;
                            if (objGridViewRow.Cells[2].Value != null)
                                objpendiente = (bool)objGridViewRow.Cells[2].Value;

                            string objsesiones = null;
                            if (objGridViewRow.Cells[5].Value != null)
                                objsesiones = objGridViewRow.Cells[5].Value.ToString();

                            CollectionResultados[contador, 0] = preguntaid;
                            if (cbosino != null)
                            {
                                if (cbosino.ToString() == "Si")
                                    CollectionResultados[contador, 1] = 1;
                                else if (cbosino.ToString() == "No")
                                    CollectionResultados[contador, 1] = 0;
                            }
                            else
                                CollectionResultados[contador, 1] = null;

                            CollectionResultados[contador, 2] = objsesiones;
                            CollectionResultados[contador, 3] = objpendiente;
                            contador++;
                        }
                    }
                    int idie = _ieid;
                    int idmedicion = _medie;
                    int idactor = 0;

                    idactor = Convert.ToInt32(cboActores.SelectedValue);

                    int idusuario = 5;

                    if (_evalid == 0)
                    {
                        if (_objevaluacion.Almacenar(CollectionResultados, idie, idmedicion, idactor, idusuario, estado, 2))
                        {
                            string fecha = DateTime.Now.ToString();
                            if (estado)
                                MessageBox.Show(String.Format("Evaluación Almacenada. \nEstado: Parcial. Hora:{0}", fecha));
                            else
                            {
                                MessageBox.Show(String.Format("Evaluación Almacenada. \nEstado: Terminada. Hora:{0}", fecha));
                                gvAmb1.Enabled = false;
                                gvAmb2.Enabled = false;
                                gvAmb3.Enabled = false;
                                gvAmb4.Enabled = false;
                                gvAmb5.Enabled = false;
                                gvTopEval.Refresh();
                                cboActores.SelectedItem = "No Asignado";
                            }
                        }
                        else
                            MessageBox.Show("El proceso de almacenamiento no se pudo completar.");

                    }
                    else
                    {
                        if (_objevaluacion.ActualizarEvaluacion(CollectionResultados, _evalid, estado))
                        {
                            string fecha = DateTime.Now.ToString();
                            if (estado)
                                MessageBox.Show(String.Format("Evaluación Actualizada. \nEstado: Parcial. Hora:{0}", fecha));
                            else
                            {
                                MessageBox.Show(String.Format("Evaluación Actualizada. \nEstado: Terminada. Hora:{0}", fecha));
                                gvAmb1.Enabled = false;
                                gvAmb2.Enabled = false;
                                gvAmb3.Enabled = false;
                                gvAmb4.Enabled = false;
                                gvAmb5.Enabled = false;
                                gvTopEval.Refresh();
                                cboActores.SelectedItem = "No Asignado";
                            }
                        }
                        else
                            MessageBox.Show("El proceso de almacenamiento no se pudo completar.");
                    }
                }
                else
                {
                    MessageBox.Show("No se pudo completar el proceso de almacenamiento. Faltan preguntas por responder.");
                }
            }
        }

        private void btnguardarparcial_Click(object sender, EventArgs e)
        {
            bool exist = false;

            string idactor = cboActores.SelectedValue.ToString();
            for (int i = 0; i < gvTopEval.Rows.Count; i++)
            {
                if (gvTopEval.Rows[i].Cells[2].Value.ToString() == idactor)
                    exist = true;
            }

            if (!exist && _evalid != 0)
            {
                AlmacenarInformacion(true);
            }
            else
                AlmacenarInformacion(false);
        }
    }
}